from selenium import webdriver
from scrapy.http import HtmlResponse
from selenium.common.exceptions import TimeoutException
from scrapy import signals
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
from logging import getLogger


class SeleniumMiddleware(object):
    def __init__(self):
        self.logger = getLogger(__name__)
        self.driver = None  # 预先定义 driver 属性，初始值为 None

        options = Options()

        # 无头模式
        options.add_argument('--headless')

        # 配合上面的无界面化.
        options.add_argument('--disable-gpu')

        # 不加载图片, 提升速度
        options.add_argument('--blink-settings=imagesEnabled=false')

        # # 使用沙盒模式运行
        options.add_argument("--no-sandbox")

        # 启动无痕模式
        options.add_argument('--incognito')

        # 用户代理设置：模拟不同的浏览器或设备访问。
        options.add_argument(
            '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3')

        # 指定 Edge 浏览器的安装路径
        edge_binary_path = r"C:\Program Files (x86)\Microsoft\Edge Dev\Application\msedge.exe"  # 根据实际情况修改
        options.binary_location = edge_binary_path

        # 指定 Edge WebDriver 的路径
        edge_driver_path = r"E:\User\burn\Desktop\MyProject\Python\HelloWorld\webDriver\edge\msedgedriver.exe"
        service = Service(edge_driver_path)

        try:
            # 创建 Edge 浏览器实例
            self.driver = webdriver.Edge(service=service, options=options)
        except Exception as e:
            print(f"Failed to initialize Edge driver: {e}")

    @classmethod
    def from_crawler(cls, crawler):
        middleware = cls()
        crawler.signals.connect(middleware.spider_closed, signals.spider_closed)
        return middleware

    def process_request(self, request, spider):
        self.driver.set_page_load_timeout(30)  # 设置页面加载超时
        self.driver.set_script_timeout(30)

        if request.meta.get('selenium'):
            try:
                self.driver.get(request.url)

                body = self.driver.page_source.encode('utf-8')

                print(r'middleware body: ', body)

                return HtmlResponse(self.driver.current_url, body=body, encoding='utf-8', request=request)
            except TimeoutException:
                return HtmlResponse(self.driver.current_url, status=504, request=request)
        return None

    def spider_closed(self, spider):
        self.driver.quit()
